const mongoose = require('mongoose')
const md5 = require('md5')
// 连接数据库
// 协议://主机地址:端口/pathname  => 协议://主机地址:端口/数据库
mongoose.connect('mongodb://127.0.0.1:27017/gp28')
//.then(() => console.log('成功了')).catch(() => console.log('失败了'))

// 定义集合中文档字段类型 String Boolean Numbr Date Object mixed(所有的类型，不要用)
const userSchema = mongoose.Schema({
  username: {
    type: String,
    // 必填 
    required: [true, '用户名必须填写'],
    // 限制长度
    minLength: 2
  },
  password: {
    // select: false,
    type: String,
    // required: true,
    required: [true, '密码不能为空'],
    // 修改器
    set: v => md5(v),
    // 访问器
    get: v => '保密'
  },
  phone: {
    type: String,
    // 自定义验证器
    validate: {
      // 返回ture或false，false验证失败
      validator: function (v) {
        return /^1[3-9]\d{9}$/.test(v)
      },
      message: '手机号码不合法'
    }
  },
  sex: {
    type: Number,
    enum: [1, 2],
    default: 1
  },
  age: {
    type: Number,
    default: 1
  },
  hobbies: [String],
  isdel: {
    type: Boolean,
    default: false
  }
}, {
  // mongoose它默认会提从一个_v来记录更新版本，如果你是老项目，则一般关闭它，新项目开启,提升性能
  // versionKey: false,
  timestamps: true
})

// 得到操作的数据集合的模型
// 参数1： 定义模型名称，要求首字母大写，如果参数3不写，则集合名是以参数1单词复数的形式来创建对应集合
// 参数2： 表结构对象 schema
// 参数3： 可选 如果定义是它就是集合的名称
const model = mongoose.model('User', userSchema)

// 添加文档  1.promise,2.回调
/* model.create({
  username: 'aaa',
  password: 'admin888',
  phone: '13232352311',
  sex: 2,
  hobbies: ['a']
}).then(ret => console.log(ret)).catch(err => console.log(err.errors)) */
// }).then(ret => console.log(ret)).catch(err => console.log(err.errors.username.message))


// 查询
// find 返回就是一个数组
// findOne 返回就是一个对象
// 多条
// model.find().then(data => console.log(data))
// model.find({ isdel: true }).then(data => console.log(data))
// 指定查询记录数
// model.find().sort({updatedAt:-1}).skip(0).limit(1).then(data => console.log(data))

// 查询提定条件的数据
// model.find({username:'admin'}).then(data => console.log(data))

// // 查询单条记录
// model.findOne({username:'admin'}).then(data => console.log(data))

// 根据id返回对应记录
// model.findOne({_id:'62592ed412b923f3fb891700'}).then(data => console.log(data))
// model.findById('62592ed412b923f3fb891700').then(data => console.log(data))
// 如果你在schema中定义了select配置为true,如果你还要获取password字段就可这样完成
// model.findOne({ _id: '62592ed412b923f3fb891700' }, { password: 1 }).then(data => console.log(data))
// model.findById('62592ed412b923f3fb891700').then(data => console.log(data.password))

// 查询的同时删除
// model.findOneAndDelete({_id:'62592ed412b923f3fb891700'})

// 条件判断
// model.find({age:{$gte:2}}).then(data => console.log(data))


// 修改
// model.updateMany({ _id: '62592ed412b923f3fb891700' }, { $set: { username: 'admin888' } }).then(data => console.log(data))
// model.updateMany({ _id: '62592ed412b923f3fb891700' }, { $inc: { age: 1 } }).then(data => console.log(data))
// model.findOneAndUpdate({ _id: '62592ed412b923f3fb891700' }, { $inc: { age: 1 } }).then(data => console.log(data))

// 删除
// model.deleteMany({_id:'62592ed412b923f3fb891700'})
